home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 1
/
Gekikoh Dennoh Club Vol. 1 (Japan).7z
/
Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin
/
kowin
/
archive
/
apl
/
gview120.lzh
/
gviewsrc.lzh
/
XPIC.S
< prev
Wrap
Text File
|
1995-02-12
|
23KB
|
1,097 lines
*****************************************************************************************
* *
* X68000 PICture Save and Load Program *
* Version 1.00 By 柳沢 明 *
* *
*****************************************************************************************
* アセンブラから使う時は、たぶんスタックをきちんと確保しないと正常に動きません。
*
* Cで使う人は、ファイルは低レベルのオープンを使って下さい。
*
* PICファイルは、このままでは読み書き出来ません。ヘッダーが必要です。
*
* 画面の初期化もチェックもしません。使う方でして下さい。
KOPIC EQU 0
_WRITE EQU $ff40
_READ EQU $ff3f
_SUPER EQU $ff20
.xdef _PicLoad
.if KOPIC
.xdef _PicSave
.else
* .xref _WindowXsize
* .xref _WindowYsize
.endif
.text
*/////////////////////////////////////////////////////////////////////////////////////////
* 1ビット読み込みのマクロ(少しでも早くするためです)
load_b1 macro
local xx,yy
dbra d7,xx ビット内のポインタをチェック
move.w #1,d0
bsr load_bit_a 次のワードを読む
lsr.w d0
bra.b yy
xx
lsl.w d6
yy
endm
*/////////////////////////////////////////////////////////////////////////////////////////
* 2ビット読み込みのマクロ(少しでも早くするためです)
load_b2 macro
local xx,yy
sub.w #2,d7 ビット内のポインタをチェック
bpl.b xx
move.w #2,d0
bsr load_bit_a 次のワードを読む
bra.b yy
xx
rol.w #2,d6
move.w d6,d0
yy
and.l #3,d0
endm
*****************************************************************************************
* *
* main *
* *
*****************************************************************************************
.if KOPIC
*////////////////////////////////////////////////////////////////////////////////////////
* PicSave(int file,int X0,int Y0,int X1,int Y1,(char *)Buff,int Size )
*
* file ファイルハンドル
* X0 左上のXの位置
* Y0 左上のYの位置
* X1 右下のXの位置
* Y1 右下のYの位置
* Buff バッファのポインタ ファイル入出力用のバッファです。
* Size バッファのサイズ (128以上)
*
_PicSave
move.l sp,a0
movem.l d3-d7/a3-a6,-(sp)
lea work(pc),a6 ワークエリアのセット
clr.l -(sp)
dc.w _SUPER スーパーバイザーへ
lea 4(sp),sp
move.l d0,-(sp)
bsr PicSave セーブ
move.l d0,d1
dc.w _SUPER ユーザー
lea 4(sp),sp
move.l d1,d0
movem.l (sp)+,d3-d7/a3-a6
rts
PicSave
move.l sp,stk(a6) 大域脱出用
move.w 6(a0),file(a6) ファイルハンドルセット
move.l 8(a0),d0
move.l 12(a0),d2
move.l 16(a0),d1
move.l 20(a0),d3
bsr set_xy 座標セット
move.l 28(a0),d0
move.l 24(a0),a0
bsr バッファセット
move.l buff_point(a6),a0
clr.w (a0)+ 予約
move.w #15,(a0)+ 色のビット数
move.w delta_x(a6),(a0)+ Xのサイズセーブ
move.w delta_y(a6),(a0) Yのサイズセーブ
move.l #8,-(sp)
move.l buff_point(a6),-(sp)
move.w file(a6),-(sp)
dc.w _WRITE
tst.l d0
bmi file_error
lea 10(sp),sp
bsr 色テーブル初期化
bsr diff 変化点抽出
bsr save
bsr flush ファイルフラッシュ
clr.l d0 正常終了
rts
.endif
*////////////////////////////////////////////////////////////////////////////////////////
* PicLoad(int file,int X0,int Y0,(char *) Buff,int Size )
*
* file ファイルハンドル
* X0 左上のXの位置
* Y0 左上のYの位置
* Buff バッファのポインタ ファイル入出力用のバッファです。
* Size バッファのサイズ (128以上)
*
_PicLoad
move.l sp,a1
movem.l d3-d7/a3-a6,-(sp)
lea work(pc),a6 ワークエリアセット
clr.l -(sp)
dc.w _SUPER スーパーバイザーセット
lea 4(sp),sp
move.l d0,-(sp)
bsr PicLoad
move.l d0,d1
dc.w _SUPER ユーザー
lea 4(sp),sp
move.l d1,d0
movem.l (sp)+,d3-d7/a3-a6
rts
PicLoad
move.l sp,stk(a6) 大域脱出用
move.w 6(a1),file(a6) ファイルハンドル
move.l 16(a1),a0
move.l 20(a1),d0
bsr バッファセット
bsr read_ready
bsr get_word
tst.w d0
bne file_error
bsr get_word
cmp.w #15,d0
bne file_error
bsr get_word Xサイズセット
sub.w #1,d0
and.l #511,d0
.if KOPIC.eq.0
* move.w d0,_picSizeX+2
.endif
move.l d0,d1
bsr get_word Yサイズセット
sub.w #1,d0
and.l #511,d0
.if KOPIC.eq.0
* move.w d0,_picSizeY+2
.endif
move.l d0,d3
move.l 8(a1),d0
move.l 12(a1),d2
add.l d0,d1
add.l d2,d3
bsr set_xy 座標セット
bsr cls
bsr 色テーブル初期化
bsr load
clr.l d0
rts
*/////////////////////////////////////////////////////////////////////////////////////////
* ロードのメインです。
load
move.l start_addr(a6),a0 開始アドレスセット
bsr load_length 変化点までの長さをロード
move.w delta_y(a6),d5 Y軸のサイズセット
sub.w #1,d5
load_y
move.w d5,-(sp)
move.l a0,a1
lea 1024(a0),a0 1行下
move.l #0,d4
move.w delta_x(a6),d4 X軸のサイズセット
load_x
cmp.l d4,d3
bgt load2
sub.w d3,d4 ちなみにここではワードで大丈夫。
sub.w #1,d3
beq.b load3
move.w d3,d5
bsr yoko 横方向戻す。
load3
* 色の読み込みです。
sub.w #8,d7 まず8ビット読みます。
bpl.b load_col2
move.w #8,d0
bsr load_bit_a
bra.b load_col3
load_col2
rol.w #8,d6
move.w d6,d0
load_col3
move.b d0,d2
bmi load_col0 msbが1なら、テーブルを見に
lsl.w #8,d2 もう8ビット読んで
sub.w #8,d7
bpl.b load_col4
move.w #8,d0
bsr load_bit_a
move.b d0,d2
bra load_col5
load_col4
rol.w #8,d6
move.b d6,d2
load_col5
* さっきのと合わせて15ビットの色にする。
lsl.w #1,d2
move.w d2,d0
bsr 新色セット テーブルにセット
bra load_col1
load_col0
and.w #$7f,d0
bsr 色TOP テーブル内で最新にする
lsl.w #3,d0
move.w 0(a6,d0.w),d2 テーブルから色を取り出す。
load_col1
*
move.l a1,a2
move.w d2,(a1)+ 書く
*
* 連鎖情報読み込み
*
move.w d2,d1
addq.w #1,d1 lsbセット
load_b1 1ビット読み込み
bcc.b load_chain_e 連鎖なしなら飛ぶ
load_chain_loop
load_b2 2ビット読む
beq.b load_chain0 0なら拡張ビットを読む
lea 1020(a2),a2 下へ
add.w d0,d0
add.l d0,a2 さっき読んだ分だけ右へ
move.w d1,(a2)
bra.b load_chain_loop 次
load_chain0
load_b1 1ビット読む
bcc.b load_chain_e 0なら終わり
load_b1 1ビット読む
bcc.b load_chain1 0なら左2下
lea 1028(a2),a2 右2下
move.w d1,(a2)
bra.b load_chain_loop 次
load_chain1
lea 1020(a2),a2 左2下
move.w d1,(a2)
bra.b load_chain_loop 次
load_chain_e
*
bsr load_length 次の長さ読む
tst.l d4 このラインは終わりか?
bne load_x まだなら繰り返し
bra.b load1
load2
move.w d4,d5 ラインの右まで
bsr yoko
sub.l d4,d3
load1
move.w (sp)+,d5
dbra d5,load_y 次のラインへ
rts
*/////////////////////////////////////////////////////////////////////////////////////////
* 横方向に戻す
*
yoko
lsr.w d5
bcc yoko1
move.w (a1),d0 奇数なら1ドット分処理
beq.b yoko0
yoko6
move.w d0,d2 0でなければ新しい色セット
and.w #$fffe,d2
yoko0
move.w d2,(a1)+ それを書く
yoko1
dbra d5,yoko2
bra.b yoko7
yoko2
move.w d2,d0 d2.lに色セット
swap d2
move.w d0,d2
bra.b yoko4
yoko3 * 2ドットずつ処理
move.l d2,(a1)+
yoko4
move.l (a1),d0
dbne d5,yoko3
beq.b yoko8 本当に終わりなら終わり
swap d0
tst.w d0 1ドットずつ
beq.b yoko5
and.w #$fffe,d0
move.w d0,d2
yoko5
move.w d2,(a1)+ 次のドット
swap d0
tst.w d0
beq.b yoko0
bra.b yoko6
yoko8
move.l d2,(a1)+
yoko7
rts
.if KOPIC
*/////////////////////////////////////////////////////////////////////////////////////////
* セーブのメイン
*
save
move.w #1,d4
move.l start_addr(a6),a0 開始アドレス
clr.l d3
move.w delta_y(a6),d1
sub.w #1,d1
save0
move.l a0,a1
lea 1024(a0),a0
move.w delta_x(a6),d2
subq.w #1,d2
save1
add.l #1,d3 変化点迄の長さ
move.w (a1)+,d0
and.w d4,d0
dbne d2,save1
beq.b save2
move.l d3,d0
bsr save_length 長さセーブ
move.w -2(a1),d0
eor.w d4,d0
bsr save_color 色セーブ
bsr save_chain 連鎖セーブ
eor.w d4,-2(a1)
moveq.l #0,d3
dbra d2,save1
save2
dbra d1,save0
add.l #1,d3 おまけのセーブ
move.l d3,d0
bsr save_length
rts
*/////////////////////////////////////////////////////////////////////////////////////////
* 連鎖のセーブ
*
save_chain
movem.l d1-d3,-(sp)
lea -2(a1),a2
move.w (a2),d6
move.l a2,d5 左右のクリッピング用
and.w #$3ff,d5
move.l #0,d7
move.w d1,-(sp)
bra save_chain14
save_chain_loop
move.w d1,-(sp)
lea 1024(a2),a2 1ライン下へ
cmp.w (a2),d6 同じ色でなければ次
bne.b save_chain0
move.w #%10,d0
move.w #2,d1
bra save_chain9
save_chain0
lea -2(a2),a2 左へ
sub.w #2,d5
cmp.w left(a6),d5 左範囲チェック
blt.b save_chain1
cmp.w (a2),d6 同じ色でなければ次
bne.b save_chain1
move.w #%01,d0
move.w #2,d1
bra save_chain9
save_chain1
lea 4(a2),a2 右へ
add.w #4,d5
cmp.w right(a6),d5 右チェック
bgt.b save_chain2
cmp.w (a2),d6 同じ色でなければ次
bne.b save_chain2
move.w #%11,d0
move.w #2,d1
bra save_chain9
save_chain2
lea -6(a2),a2 左2
sub.w #6,d5
cmp.w left(a6),d5 左チェック
blt.b save_chain3
cmp.w (a2),d6 同じ色でなければ次
bne.b save_chain3
move.w #%0010,d0
move.w #4,d1
bra save_chain9
save_chain3
lea 8(a2),a2 右2
add.w #8,d5
cmp.w right(a6),d5 右チェック
bgt.b save_chain4
cmp.w (a2),d6 同じ色でなければ次
bne.b save_chain4
move.w #%0011,d0
move.w #4,d1
save_chain9
eor.w d4,(a2)
tst.w d7 1回目か
bne save_chain10
move.w #1,d7
movem.w d0-d1,-(sp)
move.w #1,d0
move.w d0,d1
bsr save_bit 1回目の時に連鎖有りを書く
movem.w (sp)+,d0-d1
save_chain10
bsr save_bit ビット書く
save_chain14
move.w (sp)+,d1
dbra d1,save_chain_loop
save_chain13
tst.w d7
beq save_chain11
move.w #0,d0 連鎖があった時は、3ビット0で終わり
move.w #3,d1
bsr save_bit
bra save_chain12
save_chain11
move.w #0,d0 終わりのビット
move.w #1,d1
bsr save_bit
save_chain12
movem.l (sp)+,d1-d3
rts
save_chain4
move.w (sp)+,d1
bra save_chain13
.endif
*****************************************************************************************
* *
* パラメータセット *
* *
*****************************************************************************************
*///////////////////////////////////////////////////////////////////////////////////////
* X,Yの位置をセット
* (d0,d1)-(d2,d3)
set_xy
movem.l d0-d4,-(sp)
move.w d0,x0(a6)
move.w d1,x1(a6)
move.w d2,y0(a6)
move.w d3,y1(a6)
cmp.w d0,d1 サイズをチェック
blt size_error
cmp.w d2,d3
blt size_error
cmp.w #512,d0
bge size_error
cmp.w #512,d1
bge size_error
cmp.w #512,d2
bge size_error
cmp.w #512,d3
bge size_error
move.w d1,d4 幅
sub.w d0,d4
add.w #1,d4
move.w d4,delta_x(a6)
move.w d3,d4
sub.w d2,d4
add.w #1,d4
move.w d4,delta_y(a6)
moveq.l #0,d4
move.w d2,d4
lsl.l #5,d4
lsl.l #5,d4
add.l d0,d0
move.w d0,left(a6) 左の位置
add.l d0,d4
* add.l #$c00000,d4
add.l _PicBUFADR,d4
move.l d4,start_addr(a6) 開始点
moveq.l #0,d4
move.w d3,d4
lsl.l #5,d4
lsl.l #5,d4
add.l d1,d1
move.w d1,right(a6) 右の位置
add.l d1,d4
* add.l #$c00000,d4
add.l _PicBUFADR,d4
move.l d4,end_addr(a6) 終わり点
movem.l (sp)+,d0-d4
rts
*****************************************************************************************
* *
* クリアと変化点抽出 *
* *
*****************************************************************************************
*////////////////////////////////////////////////////////////////////////////////////////
* 画面をクリアする
cls
movem.l d0-d7/a0-a5,-(sp)
move.w delta_x(a6),d0
move.w d0,d1
and.w #15,d1
lsr.w #4,d0
move.w delta_y(a6),d2
subq.w #1,d2
move.l end_addr(a6),a5
add.l #2,a5
moveq.l #0,d4
move.l d4,d5
move.l d5,d6
move.l d6,d7
move.l d7,a0
move.l a0,a1
move.l a1,a2
move.l a2,a3
cls_lopy
move.l a5,a4
lea -1024(a5),a5
move.w d1,d3
bra cls_x0
cls_lopx0
clr.w -(a4) 16ドット未満を1ドットずつクリア
cls_x0
dbra d3,cls_lopx0
move.w d0,d3
bra cls_x1
cls_lopx1
movem.l d4-d7/a0-a3,-(a4) 16ドットずつクリア
cls_x1
dbra d3,cls_lopx1
dbra d2,cls_lopy
movem.l (sp)+,d0-d7/a0-a5
rts
.if KOPIC
*////////////////////////////////////////////////////////////////////////////////////////
* 変化点抽出
diff
move.w #1,d4
move.w #$fffe,d5
move.l start_addr(a6),a0
move.w (a0),d0
not.w d0
move.w delta_y(a6),d1
subq.w #1,d1
diff0
move.l a0,a1
lea 1024(a0),a0
move.w delta_x(a6),d2
subq.w #1,d2
diff1
and.w d5,(a1) 下位ビットクリア
move.w (a1)+,d3
cmp.w d3,d0 前の色とチェック
beq.b diff2
or.w d4,-2(a1) 違えば下位ビットセット
diff2
move.w d3,d0
dbra d2,diff1
dbra d1,diff0
rts
*****************************************************************************************
* *
* ファイルの制御 *
* *
*****************************************************************************************
*///////////////////////////////////////////////////////////////////////////////////////
* 色を書く d0
save_color
movem.l d0-d1,-(sp)
bsr 色サーチ テーブルにあるか?
tst.w d1
bmi save_col0
or.w #$80,d1 テーブルにあったら
move.l d1,d0 テーブルの位置をセーブ
move.l #8,d1
bsr save_bit
bra save_col1
save_col0
lsr.w d0
move.w #16,d1 色セーブ
bsr save_bit
save_col1
movem.l (sp)+,d0-d1
rts
********************************************************************************
* 長さをセーブ
*
save_length * in d0
movem.l d0-d5,-(sp)
move.l d0,d5
moveq.l #0,d2
move.l d2,d4
move.l #1,d3
save_lenLop * Wyle符号の長さ
add.w #1,d2
add.l d3,d3
add.l d3,d4
cmp.l d4,d5
bgt save_lenLop
add.l #1,d5
sub.l d3,d5
cmp.w #8,d2
bgt save_len0 8ドットより長い時は飛ぶ
move.l #$fffe,d0
move.w d2,d1
bsr save_bit
move.l d5,d0
bsr save_bit セーブ
bra save_len1
save_len0
move.l #$ffff,d0
move.w #8,d1
bsr save_bit
move.l #$fffe,d0
move.w d2,d1
sub.w #8,d1
bsr save_bit
move.l d5,d0
lsr.l #8,d0
move.w d2,d1
sub.w #8,d1
bsr save_bit
move.l d5,d0
move.w #8,d1
bsr save_bit
save_len1
movem.l (sp)+,d0-d5
rts
.endif
********************************************************************************
* 長さをロード
*
load_length
move.w #-1,d5
load_lenLop
dbra d7,load_len3
move.w #1,d0
bsr load_bit_a
lsr.w d0
dbcc d5,load_lenLop
bra.b load_len2
load_len3
lsl.w d6
dbcc d5,load_lenLop Wyle符号長?
load_len2
neg.w d5
move.l #1,d3
lsl.l d5,d3
cmp.w #8,d5 8より長い時は2回に分ける
bgt.b load_len0
move.w d5,d0
sub.w d0,d7
bpl.b load_len5
bsr load_bit_a
bra load_len1
load_len5
swap d6
clr.w d6
rol.l d0,d6
move.w d6,d0
swap d6
bra load_len1
load_len0
move.w d5,d0
sub.w #8,d0
sub.w d0,d7
bpl.b load_len6
bsr load_bit_a
bra load_len7
load_len6
swap d6
clr.w d6
rol.l d0,d6
move.w d6,d0
swap d6
load_len7
move.l #0,d1
move.w d0,d1
move.w #8,d0
lsl.l d0,d1
sub.w d0,d7
bpl.b load_len8
bsr load_bit_a
bra load_len9
load_len8
rol.w #8,d6
move.w d6,d0
and.w #255,d0
load_len9
move.b d0,d1
move.w d1,d0
load_len1
and.l #$ffff,d0
add.l d0,d3
sub.l #1,d3
rts
*////////////////////////////////////////////////////////////////////////////////////////
* ビット読み込み
* in d0 = bits length
* out d0 = data
load_bit
sub.w d0,d7 ビットポイントチェック
blt.b load_bit_a
swap d6
clr.w d6
rol.l d0,d6
move.w d6,d0
swap d6
rts
load_bit_a
add.w d0,d7
addq.w #1,d7
and.l #$ffff,d6
lsl.l d7,d6
sub.w d7,d0
move.w d0,d7
subq.l #2,buff_lest(a6)
bne.b load_bit0 必要があれば次のバッファ読む
move.l buff_addr(a6),a5
move.l buff_size(a6),-(sp)
move.l buff_addr(a6),-(sp)
move.w file(a6),-(sp)
dc.w _READ
lea 10(sp),sp
move.l d0,buff_lest(a6)
bmi file_error
load_bit0
move.w (a5)+,d6
lsl.l d7,d6
neg.w d7
add.w #15,d7
move.l d6,d0
swap d0
load_bit_e
rts
*////////////////////////////////////////////////////////////////////////////////////////
* 1ワード読む(ただし、ビット区切りをする前)
* out d0 = data
get_word
subq.l #2,buff_lest(a6)
bne.b get_word0
move.l buff_addr(a6),a5
move.l buff_size(a6),-(sp)
move.l buff_addr(a6),-(sp)
move.w file(a6),-(sp)
dc.w _READ
lea 10(sp),sp
move.l d0,buff_lest(a6)
bmi file_error
get_word0
move.w d6,d0
move.w (a5)+,d6
rts
*////////////////////////////////////////////////////////////////////////////////////////
* 読み込みのための用意
read_ready
move.l buff_addr(a6),a5
move.l buff_size(a6),-(sp)
move.l buff_addr(a6),-(sp)
move.w file(a6),-(sp)
dc.w _READ
lea 10(sp),sp
move.l d0,buff_lest(a6)
bmi file_error
move.w (a5)+,d6
rts
.if KOPIC
********************************************************************************
* d0 : data
* d1 : bit (1~16)
save_bit
movem.l d0-d2/a0,-(sp)
move.w #16,d2
sub.w d1,d2
lsl.w d2,d0
move.l buff_point(a6),a0
cmp.w bit_point(a6),d1
bgt save_bit0
sub.w d1,bit_point(a6)
swap d0
move.w (a0),d0
rol.l d1,d0
move.w d0,(a0)
bra save_bit1
save_bit0
move.w bit_point(a6),d2
addq.w #1,d2
swap d0
move.w (a0),d0
rol.l d2,d0
move.w d0,(a0)
bsr buff_write
move.l buff_point(a6),a0
neg.w d2
add.w d1,d2
rol.l d2,d0
move.w d0,(a0)
neg.w d2
add.w #15,d2
move.w d2,bit_point(a6)
save_bit1
movem.l (sp)+,d0-d2/a0
rts
*////////////////////////////////////////////////////////////////////////////////////////
* バッファのポインタを1つ進め一杯になったらファイルに書き込む。
buff_write
move.l d0,-(sp)
addq.l #2,buff_point(a6)
subq.l #2,buff_lest(a6)
bne buff_write_0
move.l buff_size(a6),buff_lest(a6)
move.l buff_addr(a6),buff_point(a6)
move.l buff_size(a6),-(sp)
move.l buff_addr(a6),-(sp)
move.w file(a6),-(sp)
dc.w _WRITE
lea 10(sp),sp
tst.l d0
bmi file_error
buff_write_0
move.l (sp)+,d0
rts
*////////////////////////////////////////////////////////////////////////////////////////
* 書き込みバッファのフラッシュ
flush
movem.l d0-d1/a0,-(sp)
move.w bit_point(a6),d0
move.l buff_point(a6),a0
move.w (a0),d1
add.w #1,d0
lsl.w d0,d1
move.w d1,(a0)
bsr buff_write
move.l buff_size(a6),d0
sub.l buff_lest(a6),d0
move.l d0,-(sp)
move.l buff_addr(a6),-(sp)
move.w file(a6),-(sp)
dc.w _WRITE
lea 10(sp),sp
tst.l d0
bmi file_error
movem.l (sp)+,d0-d1/a0
rts
.endif
*////////////////////////////////////////////////////////////////////////////////////////
* バッファをセットします。
*
* in d0 = buff size
* out a0 = buff address
バッファセット
and.l #$ffff_fffe,d0
cmp.l #128,d0
blt buff_error
move.l d0,buff_size(a6)
move.l d0,buff_lest(a6)
move.l a0,buff_addr(a6)
move.l a0,buff_point(a6)
move.w #15,bit_point(a6)
move.w #15,d7
rts
*****************************************************************************************
* *
* 色のテーブルの処理 *
* *
*****************************************************************************************
* 128の色テーブルが有り、過去128色分がテーブルに登録されている。
* 新しい色が来たら、それがテーブルにあればそれを最新にする。なければ
* 最も古いのをテーブルから追い出しそこにセット。
* これによって、テーブルにある色は、フラグと合わせ8ビットになるのでその分得です。
*////////////////////////////////////////////////////////////////////////////////////////
* 最新にします。
* in d0.w = point
*
色TOP
movem.w d0-d2,-(sp)
lsl.w #3,d0
cmp.w color_new(a6),d0
beq 色TOP0
move.w 2(a6,d0.w),d1
move.w 4(a6,d0.w),d2
move.w d1,2(a6,d2.w)
move.w d2,4(a6,d1.w)
move.w color_new(a6),d1
move.w 2(a6,d1.w),d2
move.w d0,2(a6,d1.w)
move.w d2,2(a6,d0.w)
move.w d0,4(a6,d2.w)
move.w d1,4(a6,d0.w)
move.w d0,color_new(a6)
色TOP0
movem.w (sp)+,d0-d2
rts
*////////////////////////////////////////////////////////////////////////////////////////
* テーブルを見て、あれば最新無ければ登録します。
* in d0.w = color
* out d1.w = 0-127 / -1
*
色サーチ
movem.l d0/a0,-(sp)
lea -8(a6),a0
move.w #128-1,d1
色サーチLOOP
lea 8(a0),a0
cmp.w (a0),d0
dbeq d1,色サーチLOOP
bne 色サーチ0
not.w d1
and.w #127,d1
move.w d1,d0
bsr 色TOP
move.w d0,d1
bra 色サーチ1
色サーチ0
bsr 新色セット
move.w #-1,d1
色サーチ1
movem.l (sp)+,d0/a0
rts
*////////////////////////////////////////////////////////////////////////////////////////
*
* in d0.w = color
* out none
*
新色セット
move.w d1,-(sp)
move.w color_new(a6),d1
move.w 2(a6,d1.w),d1
move.w d1,color_new(a6)
move.w d0,0(a6,d1.w)
move.w (sp)+,d1
rts
*////////////////////////////////////////////////////////////////////////////////////////
*
色テーブル初期化
movem.l d0-d2/a0,-(sp)
move.l a6,a0
move.w #1*8,d1
move.w #127*8,d2
move.w #128-1,d0
色初期化LOOP
clr.w (a0)+
move.w d1,(a0)+
addq.w #8,d1
cmp.w #128*8,d1
bne 色初期化0
clr.w d1
色初期化0
move.w d2,(a0)
addq.w #8,d2
cmp.w #128*8,d2
bne 色初期化1
clr.w d2
色初期化1
lea 4(a0),a0
dbra d0,色初期化LOOP
clr.w color_new(a6)
movem.l (sp)+,d0-d2/a0
rts
*****************************************************************************************
* *
* エラールーチン *
* *
*****************************************************************************************
buff_error *メモリーが足りません。
move.l #1,d0
bra 大域脱出
file_error *ファイルエラー。
move.l #2,d0
bra 大域脱出
size_error *位置の指定に誤りがあります。
move.l #3,d0
bra 大域脱出
大域脱出
move.l stk(a6),sp
rts
*****************************************************************************************
* *
* 変数領域 *
* *
*****************************************************************************************
.dc.b "--PIC Ver1.00 By 柳沢明--",0
*ただの落書きです
.even
.offset 0
color_table: .ds.w 128*4 色のテーブル用
color_new: .ds.w 1 最新のポイント
x0: .ds.w 1
x1: .ds.w 1
y0: .ds.w 1
y1: .ds.w 1
start_addr: .ds.l 1
end_addr: .ds.l 1
delta_x: .ds.w 1
delta_y: .ds.w 1
left: .ds.w 1
right: .ds.w 1
buff_addr: .ds.l 1
buff_size: .ds.l 1
buff_point: .ds.l 1
buff_lest: .ds.l 1
bit_point: .ds.w 1
file: .ds.w 1
stk: .ds.l 1
work_size:
.text
work: .ds.b work_size
.end